#include <iostream>
#include <vector>
#include <sw/redis++/redis++.h>
#include "../util.hpp"

/*
    list类型命令的基本使用
*/

void test1(sw::redis::Redis& redis)
{
    // lpush、rpush、lrange的使用

    redis.flushall();
    // 一次设置一个
    redis.lpush("key1", "111");

    // 初始化列表一次设置多个
    redis.lpush("key1", {"222", "333", "444"});

    // 迭代器一次设置多个
    std::vector<std::string> v = {"555", "666"};
    redis.rpush("key1", v.begin(), v.end());

    std::vector<std::string> result;
    std::back_insert_iterator<std::vector<std::string>> it = std::back_inserter(result);
    redis.lrange("key1", 0, -1, it);
    std::cout << "[0,-1]" << std::endl;
    printContainer(result);

    result.clear();
    redis.lrange("key1", 2, 100, it);
    std::cout << "[2,100]" << std::endl;
    printContainer(result);
}

void test2(sw::redis::Redis& redis)
{
    // lpop、rpop的使用
    redis.flushall();
    redis.rpush("key1", {"111", "222", "333", "444", "555", "666"});

    sw::redis::OptionalString s = redis.lpop("key1");
    if(s)
        std::cout << s.value() << std::endl;
    else
        std::cout << "不存在" << std::endl;

    s = redis.rpop("key1");
    if(s)
        std::cout << s.value() << std::endl;
    else
        std::cout << "不存在" << std::endl;

    s = redis.lpop("key10");
    if(s)
        std::cout << s.value() << std::endl;
    else
        std::cout << "不存在" << std::endl;
}

void test3(sw::redis::Redis& redis)
{
    // blpop
    redis.flushall();
    redis.rpush("key1", {"111", "222", "333", "444", "555", "666"});

    //默认是永久阻塞
    sw::redis::OptionalStringPair p = redis.blpop("key1");
    // 阻塞命令的返回值是pair，因为这个命令可以监听多个list，pair.first是哪个列表，pair.second是对应的元素
    if(p)
        //std::cout << p.value().first << ": " << p.value().second << std::endl; //写法一
        std::cout << p->first << ": " << p->second << std::endl; //写法二
    else
        std::cout << "不存在" << std::endl;

    // 监听多个，阻塞10s
    p = redis.blpop({"key3", "key2", "key1"}, std::chrono::seconds(10));
    if(p)
        std::cout << p->first << ": " << p->second << std::endl;
    else
        std::cout << "不存在" << std::endl;
}

void test4(sw::redis::Redis& redis)
{
    // llen和lindex
    redis.flushall();
    redis.rpush("key1", {"111", "222", "333", "444", "555", "666"});

    long long len = redis.llen("key1");
    std::cout << "len=" << len << std::endl;

    sw::redis::OptionalString s = redis.lindex("key1", 0);
    if(s)
        std::cout << s.value() << std::endl;
    else
        std::cout << "不存在" << std::endl;

    s = redis.lindex("key1", 100);
    if(s)
        std::cout << s.value() << std::endl;
    else
        std::cout << "不存在" << std::endl;
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    test4(redis);
    return 0;
}